package ar.edu.unrn.lia.model;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.OrderBy;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.Email;

@Entity
@Table(name = "cliente")
public class Cliente extends BaseEntity implements
		java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 3035090481823131742L;

	private String cbu;

	private String dni;

	private String mail;

	private String nombre;

	private String apellido;

	private String telefono;

	private String codPostal;

	private String dirCalle;

	private Integer dirNumero;

	private String dirDepto;

	private Integer dirPiso;

	private Cuenta cuenta;
	
	private List<Recibo> recibos = new ArrayList<Recibo>(0);

	public Cliente() {
	}

	public Cliente(String nombre, String apellido, String cbu, String dni,
			String telefono, String mail) {
		this.cbu = cbu;
		this.dni = dni;
		this.mail = mail;
		this.nombre = nombre;
		this.apellido = apellido;
		this.telefono = telefono;
	}

	@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
	@JoinColumn(name="cuenta_id")
	public Cuenta getCuenta() {
		return cuenta;
	}

	public void setCuenta(Cuenta cuenta) {
		this.cuenta = cuenta;
	}

	@Column(name = "cbu")
	public String getCbu() {
		return this.cbu;
	}

	public void setCbu(String cbu) {
		this.cbu = cbu;
	}

	@Column(name = "dni", nullable = false)
	@NotNull(message = "{dni.notnull}")
	public String getDni() {
		return this.dni;
	}

	public void setDni(String dni) {
		this.dni = dni;
	}

	@Column(name = "mail", nullable = false)
	@NotNull(message = "{mail.notnull}")
	@Email
	public String getMail() {
		return this.mail;
	}

	public void setMail(String mail) {
		this.mail = mail;
	}

	@Column(name = "nombre", nullable = false)
	@NotNull(message = "{nombre.notnull}")
	public String getNombre() {
		return this.nombre;
	}

	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	@Column(name = "apellido", nullable = false)
	@NotNull(message = "{apellido.notnull}")
	public String getApellido() {
		return this.apellido;
	}

	public void setApellido(String apellido) {
		this.apellido = apellido;
	}

	@Column(name = "telefono")
	@NotNull(message = "{telefono.notnull}")
	public String getTelefono() {
		return this.telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public String apellidoNombre() {
		return getApellido() + ", " + getNombre();
	}

	@Column(name = "dir_calle")
	public String getDirCalle() {
		return dirCalle;
	}

	public void setDirCalle(String dirCalle) {
		this.dirCalle = dirCalle;
	}

	@Column(name = "dir_numero")
	public Integer getDirNumero() {
		return dirNumero;
	}

	public void setDirNumero(Integer dirNumero) {
		this.dirNumero = dirNumero;
	}

	@Column(name = "dir_depto")
	public String getDirDepto() {
		return dirDepto;
	}

	public void setDirDepto(String dirDepto) {
		this.dirDepto = dirDepto;
	}

	@Column(name = "dir_piso")
	public Integer getDirPiso() {
		return dirPiso;
	}

	public void setDirPiso(Integer piso) {
		this.dirPiso = piso;
	}

	@Column(name = "cod_postal")
	public String getCodPostal() {
		return codPostal;
	}

	public void setCodPostal(String codPostal) {
		this.codPostal = codPostal;
	}

	@OneToMany(cascade = CascadeType.ALL, mappedBy = "cliente", fetch = FetchType.LAZY)	
	@OrderBy("id DESC")
	public List<Recibo> getRecibos() {
		return recibos;
	}

	public void setRecibos(List<Recibo> recibos) {
		this.recibos = recibos;
	}
	
	public void agregarRecibo(Recibo recibo) {
		recibo.setCliente(this);
		getRecibos().add(recibo);
	}
	

}
